package cn.ipanel.bigdata.boot

import scala.beans.BeanProperty

/**
 * @author lzz
 * @projectName iBigdata
 * @date 2022/7/13 17:58
 * @description: 工具，用于读取配置
 */
package object config {

  import scala.beans.BeanProperty

  class Config extends Serializable {
    @BeanProperty var properties: Properties = _
    @BeanProperty var hadoop: Hadoop = _
    @BeanProperty var spark: Spark = _
    @BeanProperty var source: Source = _
    @BeanProperty var project: Project = _
  }

  class Properties extends Serializable {
    // 系统配置，需要通过  System.setProperty 设置到系统变量中，主要涉及
    // HADOOP_USER_NAME， hadoop.home.dir， spark.local.dir
    @BeanProperty var conf : java.util.Map[String, String] = _
    // 自定义配置项，常用
    @BeanProperty var param: java.util.Map[String, String] = _
  }

  class Hadoop extends Serializable {
    // hive 独有配置项
    @BeanProperty var hive: Hive = _
    // hdfs 独有配置项
    @BeanProperty var hdfs: java.util.List[Hdfs] = _
  }

  class Hive extends Serializable {

  }

  class Hdfs extends Serializable {
    @BeanProperty var genre   : String = _
    @BeanProperty var pathname: String = _
  }

  class Spark extends Serializable {

    @BeanProperty var master  : String = _
    @BeanProperty var conf    : java.util.Map[String, String] = _
    @BeanProperty var jars    : java.util.List[String] = _
    @BeanProperty var loglevel: String = _
  }

  class Source extends Serializable {
    // 保存各种名称的数据库跟使用协议（如mysql，phoenix）的关系
    @BeanProperty var database: java.util.List[Database] = _
    // 保存各种类型协议（如mysql，phoenix）的驱动信息
    @BeanProperty var protocol: java.util.List[Protocol] = _
    // 保存表名跟数据库名的映射
    @BeanProperty var table:    java.util.List[Table]    = _
  }

  class Table extends Serializable {
    @BeanProperty var alias   : String  = _ // 别名，也是用于保存映射关系的key
    @BeanProperty var name    : String  = _ // 物理表名，使用的外部表真实名称
    @BeanProperty var database: String  = _ // 数据库名
  }

  class Database extends Serializable {

    @BeanProperty var name    : String  = _ // 名称
    @BeanProperty var protocol: String  = _ // 协议
    @BeanProperty var port    : String  = _ // 端口
    @BeanProperty var username: String  = _ // 用户
    @BeanProperty var password: String  = _ // 密码
    @BeanProperty var url     : String  = _ // 连接
    @BeanProperty var options : java.util.Map[String, String]  = _ // 参数

    @BeanProperty var host    : String = _ // ip          ---- 目前仅redis用到
    @BeanProperty var db      : String = _ // dbindex     ---- 目前仅redis用到
  }

  class Protocol extends Serializable {

    @BeanProperty var name:   String = _ // 源名称
    @BeanProperty var source: String = _ // 源格式
    @BeanProperty var driver: String = _ // 驱动类
  }

  class Project extends Serializable {

    @BeanProperty var name: String = _
    @BeanProperty var template: java.util.List[Template] = _
  }
}